<?php
/*
 * @Description:
 * @Author: 橘子味的心
 * @Date: 2020-11-12 03:07:55
 * @LastEditTime: 2020-11-18 19:58:09
 * @LastEditors: 橘子味的心
 * @Reference:
 */
namespace app\system\controller;

use app\BaseController;
use think\facade\Cache;
use think\facade\Db;
use think\facade\Session;
use think\facade\View;

/**
 * @title 登录
 */
class Login extends BaseController
{
    //默认配置
    public $config = [
        'auth_on' => 1, // 权限开关
        'auth_type' => 1, // 认证方式，1为实时认证；2为登录认证。
        'auth_group' => 'auth_group', // 用户组数据表名
        'auth_rule' => 'auth_rule', // 权限规则表
        'auth_user' => 'auth_user', // 用户信息表
        'auth_rule_special' => 'auth_rule_special', // 特殊权限表
        'auth_rule_access' => 'auth_rule_access', // 权限规则->特殊权限表
    ];
    /**
     * @title   用户登录
     * @desc    用户登录
     * @author  橘子味的心
     * @version 1.0
     * @method  POST
     * @param   varchar username &nbsp; 用户名 YES
     * @param   varchar password &nbsp; 密码 YES
     * @return  int code &nbsp; 返回参数 200/100
     * @return  string msg &nbsp; 返回信息 successful
     * @return  array data &nbsp; 返回数据 successful
     */
    public function index()
    {
        if (request()->isPost()) {
            $username = input('username');
            $password = input('password');
            $res = $this->getLogin($username, $password);
            Session::set('auth_user', $res);
            Session::save();
            return todata($res);
        }
        View::engine()->layout(false);
        return view('index/login');
    }
    public function getLogin($username, $password)
    {
        if (empty($username)) {
            return tocode(100, '用户名不能为空！');
        }
        $res = Db::name($this->config['auth_user'])
            ->alias('a')
            ->join($this->config['auth_group'] . ' b ', 'b.id= a.group_id', 'LEFT')
            ->where('account', $username)
            ->field('a.*,b.rules')
            ->find();
        if (!$res) {
            $msg = "用户不存在!";
        } elseif ($res['password'] != passmd($password)) {
            $msg = "密码错误!" . $password;
        } elseif ($res['status'] == 0) {
            $msg = "禁止登录!";
        }
        $is_push = 0;
        if (!empty(config_group('is_push'))) {
            $is_push = 1;
        }
        if ($is_push) {
            $title = "后台登录通知";
            $time = date('Y/m/d H:i:s');
            $ip = request()->ip();
            $ipaddr = get_ip_area($ip); //根据ip地址获取地域信息
        }
        if (!empty($msg)) {
            $desc = '登陆通知 用户:' . $username . ' 登陆失败，原因：' . $msg;
            writelog($desc, 100);
            if ($is_push) {
                $content = <<<EOF
                后台登录通知
                \n
                用户：{$username}于{$time} 在  {$ipaddr} 登陆失败，原因：{$msg}，ip地址  {$ip}
                EOF;
                push($title, $content);
            }
            return tocode(100, $msg);
        }
        /**-------------- 更新登录记录 --------------*/
        Db::name('auth_user')->where('id', $res['id'])->update(['last_login_ip' => request()->ip(), 'last_login_time' => time()]);
        /**-------------- 将记录存到session --------------*/
        unset($res['password']);
        if (!empty($res['images'])) {
            $res['images_id'] = _sImage($res['images']);
        }
        $desc = '登陆通知 用户:' . $username . ' 登陆成功';
        $seal_ip = request()->ip();
        writelog($desc, 200);
        // if ($is_push) {
        //     $content = <<<EOF
        //     后台登录通知[强制退出](https://52xml.cn/api/api/seal_ip?ip={$seal_ip}&sess=1)
        //     \n
        //     用户：{$username}于{$time} 在  {$ipaddr} 登陆成功，ip地址  {$ip}
        //     EOF;
        //     push($title, $content);
        // }
        return $res;
    }
    /**
     * @title   退出登录
     * @desc    退出登录
     * @author  橘子味的心
     * @version 1.0
     * @method  POST
     * @return  int code &nbsp; 返回参数 200/100
     * @return  string message &nbsp; 返回信息 successful
     * @return  array data &nbsp; 返回数据 successful
     */
    public function logout()
    {
        Session::clear('');
        $this->success('退出登录成功！', 'login/index');
    }
    /**
     * @title   清除缓存
     * @desc    清除缓存
     * @author  橘子味的心
     * @version 1.0
     * @method  POST
     * @return  int code &nbsp; 返回参数 200/100
     * @return  string message &nbsp; 返回信息 successful
     * @return  array data &nbsp; 返回数据 successful
     */
    public function clear()
    {
        Cache::clear();
        $this->success('清除缓存成功！', 'index/index');
    }
}
